package com.myblog.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CodeGeneratorUtils {

    public static String scanner(String tip){
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入：" + tip + ": ");
        System.out.println(help.toString());
        if (scanner.hasNext()){
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)){
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }

    public static void main(String[] args){

        // 代码生成器
        AutoGenerator generator = new AutoGenerator();

        // 非默认引擎，需要设置freemarker引擎（默认Velocity）
        generator.setTemplateEngine(new FreemarkerTemplateEngine());

        // 1、全局配置
        GlobalConfig config = new GlobalConfig();
        // 生成文件的输出目录（X盘：\X文件夹或项目名）
        String property = System.getProperty("user.dir");
        config.setActiveRecord(true)                        // 是否支持AR模式
                .setAuthor("lhj")                           // 作者
                .setOpen(false)                             // 文件生成完成时是否打开目录
                .setOutputDir(property + "/src/main/java")  // 生成路径
                .setFileOverride(true)                      // 文件覆盖
                .setIdType(IdType.AUTO)                     // 主键策略
                .setServiceName("%sService")                // 设置生成的 service 接口的名字的首个字母是否为I
                .setBaseResultMap(true)                     // xml 映射文件的配置
                .setBaseColumnList(true);                   // xml 映射文件的配置

        // 2、数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)            // 设置数据库类型
                .setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3306/myblog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8")
                .setUsername("root")
                .setPassword("123456");

        // 3、策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setCapitalMode(true)                 // 开启全局大写命名
//                .setTablePrefix("sys_")                   // 表前缀（命名去除表前缀）
                .setEntityLombokModel(true)                 // 设置是否使用 lombok
                .setNaming(NamingStrategy.underline_to_camel)   // 数据库表映射到实体的命名策略（下划线转驼峰命名）
                .setEntityTableFieldAnnotationEnable(true)  // 是否生成实体时，生成字段注解
                .setInclude(scanner("表名，多个英文逗号分割").split(","));       // 生成表(测试)

        // 4、包名配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.myblog")               // 父包名
                .setMapper("mapper")
                .setService("service")
                .setServiceImpl("service.impl")
                .setController("controller")
                .setEntity("entity");

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        // 不生成如下类型模板
        templateConfig.setXml(null); // xml 自定义生成
        generator.setTemplate(templateConfig);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 自定义输出配置
        String templatePath = "/templates/mapper.xml.ftl";
        // 自定义配置优先于默认配置生效
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义xml 文件名和生成路径
                return property + "/src/main/resources/mapper/" + tableInfo.getEntityName() + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        generator.setCfg(cfg);

        // 5、整合配置
        generator.setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig);

        // 6、执行
        generator.execute();

    }

}
